Load code
Variables
Load data
Single lemma
Load data
Check uses and edges
df_comp %>%
filter(LEMMA == 'hyperlocal') %>%
select(LEMMA, USES_TOT, SUBSET, USES)
Case studies
Data overview
Usage frequency
Overall across cases
df_comp %>%
filter(
LEMMA %in% cases,
SUBSET == 'full'
) %>%
arrange(desc(USES_TOT))
Uses in first subset
df_comp %>%
filter(
SUBSETTING == 'time',
SUBSET == 'one'
) %>%
select(LEMMA, USES_TOT, USES) %>%
arrange(USES)
Degree centralization
Diachronic
plt <- df_comp %>%
select(LEMMA, SUBSETTING, SUBSET, CENT_DEGREE, CENT_EV, DENSITY) %>%
filter(
SUBSET != 'full',
LEMMA %in% cases
# LEMMA %in% c(cases, 'hyperlocal', 'blockchain', 'climate denial', 'man bun', 'upskill', 'deep learning')
# overtourism: diff too big for case study scale;
# , 'broflake', 'climate crisis', 'incel', 'overtourism'
) %>%
ggplot(., aes(x=SUBSET, y=CENT_DEGREE)) + # group=1
geom_point(aes(group=LEMMA, color=LEMMA, shape=LEMMA)) +
geom_line(aes(group=LEMMA, color=LEMMA, linetype=LEMMA)) +
guides(group=TRUE) +
ggtitle('Diffusion over time: changes in degree centralization') +
scale_y_continuous('degree centrality') +
scale_x_discrete('subset')
ggplotly(plt)
# ggsave('out/cases_cent_diac.pdf', width=6, height=4)
Overall
df_comp %>%
filter(
LEMMA %in% cases,
SUBSET == 'full'
) %>%
select(
LEMMA,
EDGES,
CENT_DEGREE,
CENT_EV
) %>%
arrange((CENT_DEGREE))
Full sample
Usage intensity
df_comp %>%
filter(SUBSET == 'full') %>%
arrange(desc(USES))
Edges
Degree centrality
Overall
List
df_comp %>%
select(LEMMA, SUBSET, USES_TOT, CENT_DEGREE, CENT_EV) %>%
filter(
SUBSET == 'full'
# USES >= 2
) %>%
arrange(
(CENT_DEGREE)
# desc(CENT_EV)
)
Plot
plt <- df_comp %>%
select(LEMMA, SUBSET, USES, CENT_DEGREE) %>%
filter(SUBSET == 'full') %>%
arrange((CENT_DEGREE)) %>%
ggplot(., aes(x=CENT_DEGREE, y=reorder(LEMMA, CENT_DEGREE))) +
geom_point() +
scale_y_discrete('lemmas') +
scale_x_continuous(
'degree centralization (log)',
trans='log'
)
plt

# ggsave('out/cent_sync_all.pdf', width=6, height=4)
Over time
Across all lemmas
df_comp %>%
filter(
SUBSET %in% c('one', 'two', 'three', 'four'),
LEMMA %in% unsuccessful_diffs
# USES_TOT >= 10000
# USES > 1000
) %>%
group_by(SUBSET) %>%
summarize(
DENS_AVG = mean(DENSITY),
CENT_AVG = mean(CENT_DEGREE)
) %>%
ggplot(., aes(x=SUBSET, y=DENS_AVG, group=1)) +
geom_line() +
geom_point() +
scale_y_continuous('degree centralization') +
scale_x_discrete('subsets')

# ggsave('out/full_cent_diac.pdf', width=6, height=4)
Biggest changes
df_comp %>%
select(LEMMA, SUBSET, CENT_DEGREE, EDGES, USES_TOT) %>%
filter(
SUBSET %in% c(
'one',
'four'
),
USES_TOT >= 10000
) %>%
dplyr::group_by(LEMMA) %>%
dplyr::mutate(CENT_DIFF = CENT_DEGREE - lag(CENT_DEGREE, default=CENT_DEGREE[1])) %>%
drop_na() %>%
select(-SUBSET) %>%
rename(
CENT_LAST = CENT_DEGREE,
EDGES_LAST = EDGES
) %>%
arrange((CENT_DIFF))
Density
df_comp %>%
select(LEMMA, SUBSET, USES_TOT, CENT_DEGREE, DENSITY) %>%
filter(SUBSET == 'four') %>%
arrange(DENSITY)
Frequency vs. networks
Frequency vs. centralization
Plot
plt <- df_comp %>%
filter(
SUBSET == 'four',
# USES_TOT %in% (150000:500000)
# LEMMA %in% c(cases)
# !LEMMA %in% c('slut shaming', 'dashcam', 'shareable', 'cuckold', 'deep learning', 'hyperlocal')
) %>%
select(LEMMA, CENT_DEGREE, USES_TOT, USES, EDGES) %>%
ggplot(., aes(x=CENT_DEGREE, y=USES_TOT)) +
geom_text(aes(label=LEMMA), hjust=-0.1, vjust=-0.1) +
# geom_point() +
scale_y_continuous(
'usage frequency (log)',
trans='log'
) +
scale_x_continuous(
'degree centralization'
# trans='log'
)
ggplotly(plt)
# ggsave('out/full_cent_freq_overall.pdf', width=6, height=4)
# ggsave('out/cases_cent_freq_overall.pdf', width=6, height=4)
Biggest discrepancies
df_comp %>%
filter(
SUBSETTING == 'time',
SUBSET == 'four'
) %>%
select(LEMMA, USES_TOT, CENT_DEGREE) %>%
mutate(DISC = USES_TOT / CENT_DEGREE) %>%
arrange(DISC)
Correlation
df_corr <- df_comp %>%
filter(
# SUBSET != 'full'
# EDGES >= 100
) %>%
select(-c(LEMMA, SUBSET, START, END, SKIP, STAMP))
cor.test(df_corr$USES, df_corr$CENT_DEGREE)
Pearson's product-moment correlation
data: df_corr$USES and df_corr$CENT_DEGREE
t = -2.3949, df = 517, p-value = 0.01698
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.18911153 -0.01884815
sample estimates:
cor
-0.1047473
Coefficient of variation
df_comp %>%
filter(
SUBSET == 'full',
USES_TOT >= 1000
) %>%
select(LEMMA, USES_TOT, COEF_VAR) %>%
arrange(desc(COEF_VAR))
Processing status
Lemma list
df_comp %>%
select(LEMMA, SUBSET, STAMP) %>%
filter(SUBSET == 'four') %>%
# mutate(STAMP = as_datetime(STAMP)) %>%
arrange(desc(STAMP))
Dataset statistics
df_comp %>%
filter(SUBSET == 'full') %>%
select(LEMMA, SUBSET, USES_TOT, USERS_TOT) %>%
dplyr::summarise(
USES_ALL = sum(USES_TOT),
USERS_ALL = sum(USERS_TOT)
)
LS0tCmF1dGhvcjogJ1F1aXJpbiBXw7xyc2NoaW5nZXInCnRpdGxlOiAiU29jaWFsIG5ldHdvcmtzIG9mIGxleGljYWwgaW5ub3ZhdGlvbiIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCi0tLQoKIyBMb2FkIGNvZGUKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CnNvdXJjZSgnc3JjL2xvYWQtZGF0YS5SJykKc291cmNlKCdzcmMvcG9zdHByb2MuUicpCnNvdXJjZSgnc3JjL3VzZXMuUicpCnNvdXJjZSgnc3JjL3VzZXJzLlInKQpzb3VyY2UoJ3NyYy9zbmEuUicpCgpsaWJyYXJ5KGNvcnJyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KG1hZ3JpdHRyKQpgYGAKCgojIFZhcmlhYmxlcwoKYGBge3IgaW5jbHVkZT1GQUxTRX0Kc3Vic2V0dGluZyA9ICd0aW1lJwpkaWZmX3N0YXJ0X21ldGhvZCA8LSAnZWRnZXMnCmRpZmZfc3RhcnRfbGltaXQgPC0gMwoKY2FzZXMgPC0gYygKICAndXBjeWNsaW5nJywKICAnYWx0LWxlZnQnLCAKICAnc29sb3ByZW5ldXInLAogICdoeXBlcmxvY2FsJwogICMgJ2dob3N0aW5nJywgCiAgIyAnbGl0dWF0aW9uJywgCiAgKQoKYGBgCgoKIyBMb2FkIGRhdGEKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmlmIChleGlzdHMoJ2RmX2NvbXAnKSA9PSBGQUxTRSkgewogIGRmX2NvbXAgPC0gcmVhZF9kZl9jb21wKGZfcGF0aD0nb3V0L2RmX2NvbXAuY3N2JykKfQpgYGAKCgojIEZpbHRlciBkYXRhCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpkZl9jb21wICU8PiUgCiAgZmlsdGVyKAogICAgU0tJUCAhPSBUUlVFLAogICAgU1VCU0VUVElORyA9PSBzdWJzZXR0aW5nLAogICAgIyBlc3RhYmxpc2hlZCB3b3JkcwogICAgIUxFTU1BICVpbiUgYygnQW5nbG8tU2F4b24nLCAnY2xpbWF0ZSBjcmlzaXMnLCAnZ2xvYmFsIGhlYXRpbmcnLCAnZ3JlZW53YXNoaW5nJywgJ3BvbGl0aWNhbCBjb3JyZWN0bmVzcycsICdyZWZ1Z2VlIGNyaXNpcyAnKQogICAgIyBzdWNjZXNzZnVsIHdvcmRzOiBVU0VTX1RPVCA+PSAxMDAwMAogICAgIyB1bnN1Y2Nlc3NmdWwgd29yZHM6IFVTRVNfVE9UIDw9IDEwMDAwCiAgICAjIHdlaXJkIHdvcmRzOiBiaWcgZGljayBlbmVyZ3kKICApCmBgYAoKCiMjIHN1Y2Nlc3MKCmBgYHtyfQpkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBVU0VTLCBDRU5UX0RFR1JFRSkgJT4lCiAgZmlsdGVyKFNVQlNFVCAhPSAnZnVsbCcpICU+JQogIGdyb3VwX2J5KExFTU1BKSAlPiUKICBtdXRhdGUoRElGRl9VU0VTID0gVVNFUyAtIGxhZyhVU0VTKSkgJT4lCiAgbXV0YXRlKERJRkZfVVNFU19UT1QgPSBzdW0oRElGRl9VU0VTLCBuYS5ybT1UUlVFKSkgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZm91cicpICU+JQogIGFycmFuZ2UoRElGRl9VU0VTX1RPVCkKCnN1Y2Nlc3NmdWxfZGlmZnMgPC0gZGZfc3VjY2VzcyAlPiUKICBmaWx0ZXIoRElGRl9VU0VTX1RPVCA+IDApICU+JQogIHB1bGwoTEVNTUEpCgp1bnN1Y2Nlc3NmdWxfZGlmZnMgPC0gZGZfc3VjY2VzcyAlPiUKICBmaWx0ZXIoRElGRl9VU0VTX1RPVCA8IDApICU+JQogIHB1bGwoTEVNTUEpCgpzdWNjZXNzZnVsX3VzZXNfbWluIDwtIGRmX2NvbXAgJT4lCiAgZmlsdGVyKFVTRVMgPiAxMDAwKSAlPiUKICBwdWxsKExFTU1BKQogIAogIAp1bnN1Y2Nlc3NmdWxfdXNlc19taW4gPC0gZGZfY29tcCAlPiUKICBmaWx0ZXIoVVNFUyA8IDEwMDApICU+JQogIHB1bGwoTEVNTUEpCmBgYAoKCiMgU2luZ2xlIGxlbW1hCgojIyBMb2FkIGRhdGEKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmNvcnB1cyA8LSAnL1ZvbHVtZXMvcWpkL3R3aW50LycKbGVtbWEgPC0gJ2JpZyBkaWNrIGVuZXJneScKCnR3ZWV0cyA8LSBsb2FkX2RhdGEoY29ycHVzLCBsZW1tYSkKdHdlZXRzIDwtIHBvc3Rwcm9jKHR3ZWV0cykKdHdlZXRzIDwtIGZpbHRlcl90d2VldHModHdlZXRzKQpgYGAKCgojIyBDaGVjayB0d2VldHMKCmBgYHtyfQp0d2VldHMgJT4lCiAgc2VsZWN0KHR3ZWV0LCBkYXRlKSAlPiUKICAjIHNsaWNlKC4sIHNhbXBsZSgxOm4oKSkpICNyYW5kb20gc2VsZWN0aW9uCiAgYXJyYW5nZShkYXRlKQpgYGAKCgojIyBDaGVjayB1c2VzIGFuZCBlZGdlcwoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKExFTU1BID09ICdoeXBlcmxvY2FsJykgJT4lCiAgc2VsZWN0KExFTU1BLCBVU0VTX1RPVCwgU1VCU0VULCBVU0VTKQpgYGAKCgojIENhc2Ugc3R1ZGllcwoKIyMgRGF0YSBvdmVydmlldwoKYGBge3IgaW5jbHVkZT1GQUxTRX0KZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBMRU1NQSAlaW4lIGNhc2VzLAogICAgU1VCU0VUID09ICdmdWxsJwogICAgKSAlPiUKICBzZWxlY3QoTEVNTUEsIFVTRVM9VVNFU19UT1QsIFNQRUFLRVJTPVVTRVJTX1RPVCkgJT4lCiAgbXV0YXRlKFVTRVNfUEVSX1NQRUFLRVIgPSBVU0VTIC8gU1BFQUtFUlMpICU+JQogIGFycmFuZ2UoZGVzYyhVU0VTKSkKICAjIGdncGxvdChkYXRhPS4sIGFlcyh4PVVTRVJTX1RPVCwgeT1VU0VTX1RPVCkpICsKICAjICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MRU1NQSkpICsKICAjICAgc2NhbGVfeV9jb250aW51b3VzKCdmcmVxdWVuY3kgKGxvZyknLCB0cmFucz0nbG9nJykKYGBgCgoKIyMgVXNhZ2UgZnJlcXVlbmN5CgojIyMgT3ZlcmFsbCBhY3Jvc3MgY2FzZXMKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIExFTU1BICVpbiUgY2FzZXMsCiAgICBTVUJTRVQgPT0gJ2Z1bGwnCiAgICApICU+JQogICBhcnJhbmdlKGRlc2MoVVNFU19UT1QpKQpgYGAKCgojIyMgVXNlcyBpbiBmaXJzdCBzdWJzZXQKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVFRJTkcgPT0gJ3RpbWUnLAogICAgU1VCU0VUID09ICdvbmUnCiAgICApICU+JQogIHNlbGVjdChMRU1NQSwgVVNFU19UT1QsIFVTRVMpICU+JQogIGFycmFuZ2UoVVNFUykKYGBgCgoKCiMjIERlZ3JlZSBjZW50cmFsaXphdGlvbgoKIyMjIERpYWNocm9uaWMKCmBgYHtyfQpwbHQgPC0gZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVFRJTkcsIFNVQlNFVCwgQ0VOVF9ERUdSRUUsIENFTlRfRVYsIERFTlNJVFkpICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCAhPSAnZnVsbCcsCiAgICBMRU1NQSAlaW4lIGNhc2VzCiAgICAjIExFTU1BICVpbiUgYyhjYXNlcywgJ2h5cGVybG9jYWwnLCAnYmxvY2tjaGFpbicsICdjbGltYXRlIGRlbmlhbCcsICdtYW4gYnVuJywgJ3Vwc2tpbGwnLCAnZGVlcCBsZWFybmluZycpCiAgICAjIG92ZXJ0b3VyaXNtOiBkaWZmIHRvbyBiaWcgZm9yIGNhc2Ugc3R1ZHkgc2NhbGU7IAogICAgIyAsICdicm9mbGFrZScsICdjbGltYXRlIGNyaXNpcycsICdpbmNlbCcsICdvdmVydG91cmlzbScKICApICU+JQogIGdncGxvdCguLCBhZXMoeD1TVUJTRVQsIHk9Q0VOVF9ERUdSRUUpKSArICMgZ3JvdXA9MQogICAgZ2VvbV9wb2ludChhZXMoZ3JvdXA9TEVNTUEsIGNvbG9yPUxFTU1BLCBzaGFwZT1MRU1NQSkpICsKICAgIGdlb21fbGluZShhZXMoZ3JvdXA9TEVNTUEsIGNvbG9yPUxFTU1BLCBsaW5ldHlwZT1MRU1NQSkpICsKICAgIGd1aWRlcyhncm91cD1UUlVFKSArCiAgICBnZ3RpdGxlKCdEaWZmdXNpb24gb3ZlciB0aW1lOiBjaGFuZ2VzIGluIGRlZ3JlZSBjZW50cmFsaXphdGlvbicpICsKICAgIHNjYWxlX3lfY29udGludW91cygnZGVncmVlIGNlbnRyYWxpdHknKSArCiAgICBzY2FsZV94X2Rpc2NyZXRlKCdzdWJzZXQnKQoKZ2dwbG90bHkocGx0KQojIGdnc2F2ZSgnb3V0L2Nhc2VzX2NlbnRfZGlhYy5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKYGBgCgoKIyMjIE92ZXJhbGwKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIExFTU1BICVpbiUgY2FzZXMsCiAgICBTVUJTRVQgPT0gJ2Z1bGwnCiAgICApICU+JQogIHNlbGVjdCgKICAgIExFTU1BLCAKICAgIEVER0VTLAogICAgQ0VOVF9ERUdSRUUsIAogICAgQ0VOVF9FVgogICAgKSAlPiUKICBhcnJhbmdlKChDRU5UX0RFR1JFRSkpCmBgYAoKCiMgRnVsbCBzYW1wbGUKCiMjIFVzYWdlIGludGVuc2l0eQoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZnVsbCcpICU+JQogIGFycmFuZ2UoZGVzYyhVU0VTKSkKYGBgCgoKIyMgRWRnZXMKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmRmX2NvbXAgJT4lCiAgZHBseXI6Omdyb3VwX2J5KExFTU1BKSAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdvbmUnKSAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFUywgRURHRVMpICU+JQogIGFycmFuZ2UoRURHRVMpCmBgYAoKCiMjIERlZ3JlZSBjZW50cmFsaXR5CgojIyMgT3ZlcmFsbAoKIyMjIyBMaXN0CgpgYGB7cn0KZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFU19UT1QsIENFTlRfREVHUkVFLCBDRU5UX0VWKSAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVQgPT0gJ2Z1bGwnCiAgICAjIFVTRVMgPj0gMgogICAgKSAlPiUKICBhcnJhbmdlKAogICAgKENFTlRfREVHUkVFKQogICAgIyBkZXNjKENFTlRfRVYpCiAgKQpgYGAKCgojIyMjIFBsb3QKCmBgYHtyfQpwbHQgPC0gZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFUywgQ0VOVF9ERUdSRUUpICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBhcnJhbmdlKChDRU5UX0RFR1JFRSkpICU+JQogIGdncGxvdCguLCBhZXMoeD1DRU5UX0RFR1JFRSwgeT1yZW9yZGVyKExFTU1BLCBDRU5UX0RFR1JFRSkpKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgc2NhbGVfeV9kaXNjcmV0ZSgnbGVtbWFzJykgKwogICAgc2NhbGVfeF9jb250aW51b3VzKAogICAgICAnZGVncmVlIGNlbnRyYWxpemF0aW9uIChsb2cpJywKICAgICAgdHJhbnM9J2xvZycKICAgICAgKQoKcGx0CgojIGdnc2F2ZSgnb3V0L2NlbnRfc3luY19hbGwucGRmJywgd2lkdGg9NiwgaGVpZ2h0PTQpCmBgYAoKCiMjIyBPdmVyIHRpbWUKCiMjIyMgQWNyb3NzIGFsbCBsZW1tYXMKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCAlaW4lIGMoJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91cicpLAogICAgTEVNTUEgJWluJSB1bnN1Y2Nlc3NmdWxfZGlmZnMKICAgICMgVVNFU19UT1QgPj0gMTAwMDAKICAgICMgVVNFUyA+IDEwMDAKICAgICkgJT4lCiAgZ3JvdXBfYnkoU1VCU0VUKSAlPiUKICBzdW1tYXJpemUoCiAgICBERU5TX0FWRyA9IG1lYW4oREVOU0lUWSksCiAgICBDRU5UX0FWRyA9IG1lYW4oQ0VOVF9ERUdSRUUpCiAgICApICU+JQogIGdncGxvdCguLCBhZXMoeD1TVUJTRVQsIHk9REVOU19BVkcsIGdyb3VwPTEpKSArCiAgICBnZW9tX2xpbmUoKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKCdkZWdyZWUgY2VudHJhbGl6YXRpb24nKSArCiAgICBzY2FsZV94X2Rpc2NyZXRlKCdzdWJzZXRzJykKCiMgZ2dzYXZlKCdvdXQvZnVsbF9jZW50X2RpYWMucGRmJywgd2lkdGg9NiwgaGVpZ2h0PTQpCmBgYAoKCiMjIyMgQmlnZ2VzdCBjaGFuZ2VzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgQ0VOVF9ERUdSRUUsIEVER0VTLCBVU0VTX1RPVCkgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUICVpbiUgYygKICAgICAgJ29uZScsIAogICAgICAnZm91cicKICAgICAgKSwKICAgIFVTRVNfVE9UID49IDEwMDAwCiAgICApICU+JQogIGRwbHlyOjpncm91cF9ieShMRU1NQSkgJT4lCiAgZHBseXI6Om11dGF0ZShDRU5UX0RJRkYgPSBDRU5UX0RFR1JFRSAtIGxhZyhDRU5UX0RFR1JFRSwgZGVmYXVsdD1DRU5UX0RFR1JFRVsxXSkpICU+JQogIGRyb3BfbmEoKSAlPiUKICBzZWxlY3QoLVNVQlNFVCkgJT4lCiAgcmVuYW1lKAogICAgQ0VOVF9MQVNUID0gQ0VOVF9ERUdSRUUsCiAgICBFREdFU19MQVNUID0gRURHRVMKICAgICkgJT4lCiAgYXJyYW5nZSgoQ0VOVF9ESUZGKSkKYGBgCgoKIyMgRGVuc2l0eQoKYGBge3J9CmRmX2NvbXAgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIFVTRVNfVE9ULCBDRU5UX0RFR1JFRSwgREVOU0lUWSkgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZm91cicpICU+JQogIGFycmFuZ2UoREVOU0lUWSkKYGBgCgoKIyBGcmVxdWVuY3kgdnMuIG5ldHdvcmtzCgojIyBGcmVxdWVuY3kgdnMuIGNlbnRyYWxpemF0aW9uCgojIyMgUGxvdAoKYGBge3J9CnBsdCA8LSBkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCA9PSAnZm91cicsCiAgICAjIFVTRVNfVE9UICVpbiUgKDE1MDAwMDo1MDAwMDApCiAgICAjIExFTU1BICVpbiUgYyhjYXNlcykKICAgICMgIUxFTU1BICVpbiUgYygnc2x1dCBzaGFtaW5nJywgJ2Rhc2hjYW0nLCAnc2hhcmVhYmxlJywgJ2N1Y2tvbGQnLCAnZGVlcCBsZWFybmluZycsICdoeXBlcmxvY2FsJykKICAgICkgJT4lCiAgc2VsZWN0KExFTU1BLCBDRU5UX0RFR1JFRSwgVVNFU19UT1QsIFVTRVMsIEVER0VTKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHg9Q0VOVF9ERUdSRUUsIHk9VVNFU19UT1QpKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPUxFTU1BKSwgaGp1c3Q9LTAuMSwgdmp1c3Q9LTAuMSkgKyAKICAgICMgZ2VvbV9wb2ludCgpICsKICAgIHNjYWxlX3lfY29udGludW91cygKICAgICAgJ3VzYWdlIGZyZXF1ZW5jeSAobG9nKScsIAogICAgICB0cmFucz0nbG9nJwogICAgICApICsKICAgIHNjYWxlX3hfY29udGludW91cygKICAgICAgJ2RlZ3JlZSBjZW50cmFsaXphdGlvbicKICAgICAgIyB0cmFucz0nbG9nJwogICAgICApCgpnZ3Bsb3RseShwbHQpCiMgZ2dzYXZlKCdvdXQvZnVsbF9jZW50X2ZyZXFfb3ZlcmFsbC5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKIyBnZ3NhdmUoJ291dC9jYXNlc19jZW50X2ZyZXFfb3ZlcmFsbC5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKYGBgCgoKIyMjIEJpZ2dlc3QgZGlzY3JlcGFuY2llcwoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUVElORyA9PSAndGltZScsCiAgICBTVUJTRVQgPT0gJ2ZvdXInCiAgICApICU+JQogIHNlbGVjdChMRU1NQSwgVVNFU19UT1QsIENFTlRfREVHUkVFKSAlPiUKICBtdXRhdGUoRElTQyA9IFVTRVNfVE9UIC8gQ0VOVF9ERUdSRUUpICU+JQogIGFycmFuZ2UoRElTQykKYGBgCgoKIyMjIENvcnJlbGF0aW9uCgpgYGB7cn0KZGZfY29yciA8LSBkZl9jb21wICU+JQogIGZpbHRlcigKICAgICMgU1VCU0VUICE9ICdmdWxsJwogICAgIyBFREdFUyA+PSAxMDAKICAgICkgJT4lCiAgc2VsZWN0KC1jKExFTU1BLCBTVUJTRVQsIFNUQVJULCBFTkQsIFNLSVAsIFNUQU1QKSkKICAKY29yLnRlc3QoZGZfY29yciRVU0VTLCBkZl9jb3JyJENFTlRfREVHUkVFKQpgYGAKCgojIENvZWZmaWNpZW50IG9mIHZhcmlhdGlvbgoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUID09ICdmdWxsJywKICAgIFVTRVNfVE9UID49IDEwMDAKICAgICkgJT4lCiAgc2VsZWN0KExFTU1BLCBVU0VTX1RPVCwgQ09FRl9WQVIpICU+JQogIGFycmFuZ2UoZGVzYyhDT0VGX1ZBUikpCmBgYAoKCiMgUHJvY2Vzc2luZyBzdGF0dXMKCiMjIExlbW1hIGxpc3QKCmBgYHtyfQpkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBTVEFNUCkgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZm91cicpICU+JQogICMgbXV0YXRlKFNUQU1QID0gYXNfZGF0ZXRpbWUoU1RBTVApKSAlPiUKICBhcnJhbmdlKGRlc2MoU1RBTVApKQpgYGAKCgojIyBEYXRhc2V0IHN0YXRpc3RpY3MKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFU19UT1QsIFVTRVJTX1RPVCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZSgKICAgIFVTRVNfQUxMID0gc3VtKFVTRVNfVE9UKSwKICAgIFVTRVJTX0FMTCA9IHN1bShVU0VSU19UT1QpCiAgICApCmBgYA==